Parameters

filtered_data <- read.csv("../data/data-2023-09-11 (2).csv", header = TRUE)

selected_stats <- c("Ho", "Hs", "Ht", "Fis (W&C)", "Fst (W&C)", "Fis (Nei)", "Fst (Nei)"
)

n_rep=10

n_pop = 8

sequence_length <- length(6:11) 

data filtering convertion

library(hierfstat)
library(adegenet)
filtered_data <- data.frame(indv = paste(substr(filtered_data$Population,1,3), row.names(filtered_data), sep="."), filtered_data)
# Create mydata_genind
population <- filtered_data$Population
mydata_genind <- df2genind(
  X = filtered_data[,6:11],
  sep = "/",
  ncode = 6,
  ind.names = filtered_data$indv,
  pop = filtered_data$Population,
  NA.char = "0/0",
  ploidy = 2,
  type = "codom",
  strata = NULL,
  hierarchy = NULL
)
mydata_genind
/// GENIND OBJECT /////////

 // 698 individuals; 6 loci; 48 alleles; size: 195 Kb

 // Basic content
   @tab:  698 x 48 matrix of allele counts
   @loc.n.all: number of alleles per locus (range: 5-12)
   @loc.fac: locus factor for the 48 columns of @tab
   @all.names: list of allele names for each locus
   @ploidy: ploidy of each individual  (range: 2-2)
   @type:  codom
   @call: df2genind(X = filtered_data[, 6:11], sep = "/", ncode = 6, ind.names = filtered_data$indv, 
    pop = filtered_data$Population, NA.char = "0/0", ploidy = 2, 
    type = "codom", strata = NULL, hierarchy = NULL)

 // Optional content
   @pop: population of each individual (group size range: 24-166)
mydata_hierfstat <- genind2hierfstat(mydata_genind)

Run basic.stats and render the result

library(pegas)
Loading required package: ape

Attaching package: ‘ape’

The following objects are masked from ‘package:hierfstat’:

    pcoa, varcomp

Registered S3 method overwritten by 'pegas':
  method      from
  print.amova ade4

Attaching package: ‘pegas’

The following object is masked from ‘package:ape’:

    mst

The following object is masked from ‘package:ade4’:

    amova
library(dplyr)

Attaching package: ‘dplyr’

The following object is masked from ‘package:ape’:

    where

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
library(tibble)

result <- basic.stats(mydata_hierfstat)
df_resutl_basic<-as.data.frame(result$perloc)

# Weir and Cockrham estimates of Fstatistics - FIS and FST 
result_f_stats <- Fst(as.loci(mydata_genind), na.alleles = "")
result_f_stats <- result_f_stats[,2:3]
colnames(result_f_stats) <- c("Fst (W&C)", "Fis (W&C)")
result_f_stats <- merge(result_f_stats, df_resutl_basic, by="row.names",all.x=TRUE)
colnames(result_f_stats)[10] <- "Fst (Nei)"
colnames(result_f_stats)[12] <- "Fis (Nei)"
result_f_stats <- result_f_stats %>% column_to_rownames(., var = 'Row.names')
result_f_stats_selec <- result_f_stats %>% select(all_of(selected_stats))
result_f_stats_selec

G-statistic

library(hrbrthemes)
library(ggplot2)

# compute the Gstats
result_f_stats <- result_f_stats %>% mutate(GST = 1-Hs/Ht)
result_f_stats <- result_f_stats %>% mutate("GST''" = (n_pop*(Ht-Hs))/((n_pop*Hs-Ht)*(1-Hs)))
result_f_stats

# Plot with linear trend
p2 <- ggplot(result_f_stats, aes(x=GST, y=Hs)) +
  geom_point() +
  geom_smooth(method=lm , color="red", se=FALSE) +
  theme_ipsum()
p2

Missing data

# Libraries
library("poppr")
This is poppr version 2.9.4. To get started, type package?poppr
OMP parallel support: available
library("heatmaply")
Loading required package: plotly
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio

Attaching package: ‘plotly’

The following object is masked from ‘package:ggplot2’:

    last_plot

The following object is masked from ‘package:stats’:

    filter

The following object is masked from ‘package:graphics’:

    layout

Loading required package: viridis
Loading required package: viridisLite
Registered S3 method overwritten by 'dendextend':
  method     from 
  rev.hclust vegan
Registered S3 method overwritten by 'seriation':
  method         from 
  reorder.hclust vegan

======================
Welcome to heatmaply version 1.5.0

Type citation('heatmaply') for how to cite the package.
Type ?heatmaply for the main documentation.

The github page is: https://github.com/talgalili/heatmaply/
Please submit your suggestions and bug-reports at: https://github.com/talgalili/heatmaply/issues
You may ask questions at stackoverflow, use the r and heatmaply tags: 
     https://stackoverflow.com/questions/tagged/heatmaply
======================
missing_data <- info_table(mydata_genind, plot = FALSE)

# Matrix format
mat <- as.matrix(missing_data)
# heatmap
p <- heatmaply(mat, 
               dendrogram = "none",
               xlab = "", ylab = "", 
               main = "",
               scale = "column",
               margins = c(60,100,40,20),
               grid_color = "white",
               grid_width = 0.00001,
               titleX = FALSE,
               hide_colorbar = TRUE,
               branches_lwd = 0.1,
               label_names = c("Population", "Marker", "Value"),
               fontsize_row = 8, fontsize_col = 8,
               labCol = colnames(mat),
               labRow = rownames(mat),
               heatmap_layers = theme(axis.line=element_blank())
)
p

HW - Panmixia

with pegas


library("pegas")
hw.test(as.loci(mydata_genind), B = 1000)
        chi^2 df Pr(chi^2 >) Pr.exact
B12 693.49866 15   0.0000000    0.000
C07  27.78220 28   0.4760334    0.109
D12 799.33270 66   0.0000000    0.000
D10 492.53039 28   0.0000000    0.000
A12  11.89948 10   0.2918403    0.207
C03  56.70154 36   0.0153672    0.095
#li

with genepop

library(radiator)
#https://thierrygosselin.github.io/radiator/reference/genomic_converter.html
#https://thierrygosselin.github.io/radiator/articles/rad_genomics_computer_setup.html

mydata1 <- genomic_converter(mydata_genind, parallel.core = parallel::detectCores() - 1, output = "genepop", filename = "../data/mydata.genepop.txt")

library(genepop)
# https://cran.r-project.org/web/packages/genepop/genepop.pdf
genepop_HW <- test_HW(
  inputFile = "../data/mydata.genepop.txt",
  which = "Proba",
  outputFile = "",
  settingsFile = "",
  enumeration = FALSE,
  dememorization = 10000,
  batches = 20,
  iterations = 5000,
  verbose = interactive()
)

Linkage Disequilibrium

I have found different values from Fstats.

with poppr

The index of association was originally developed by A.H.D. Brown analyzing population structure of wild barley (Brown, 1980).

Ia: The index of association. p.Ia: The p-value resulting from a one-sided permutation test based on the number of samples indicated in the original call. rbard: The standardized index of association. p.rd: The p-value resulting from a one-sided permutation test based on the number of samples indicated in the original call.

pair.ia calculates the index of association in a pairwise manner among all loci.

loci_pair <- pair.ia(mydata_genind, sample = 1000, quiet = FALSE, method = 1,plot = FALSE)

  |                                                                                                
  |                                                                                          |   0%
                                                                                                   

  |                                                                                                
  |                                                                                          |   0%
  |                                                                                                
  |==                                                                                        |   2%
  |                                                                                                
  |====                                                                                      |   4%
                                                                                                   

with genepop

library(genepop)
test_LD(
  inputFile = "../data/mydata.genepop.txt",
  outputFile = "",
  settingsFile = "",
  dememorization = 10000,
  batches = 100,
  iterations = 5000,
  verbose = interactive()
)

with pegas

LD2 is based on the observed frequencies of different genotypes (Schaid 2004).

print(linkage_pegas$T2)
         T2          df       P-val 
69.43451606 48.00000000  0.02313167 

We thus accept the null hypothesis of no linkage among markers (P-val = 0.02313167)

DEVELOPMENT

not ready for deployment

panmixia Fstat - shuffle df


#shuffled_matrices <- replicate(n_rep, mat[sample(nrow(mat)), ], simplify = FALSE)
shuffled_matrices <- replicate(n_rep, mat[sample(length(mat), replace = FALSE)], simplify = FALSE)
##################
# shuffle only the genotype and add the pop column later for each matrices. 
#in the loop? 
###############


# Create a list to store the wc
fst_df <- numeric(sequence_length)
fis_df <- numeric(sequence_length)

# Calculate the average for each shuffled matrix

# Iterate through the shuffled matrices
for (i in 1:n_rep) {
  # Calculate the statistics for the i-th matrix
  #HERE THE COLUMN POP
  merged_df <- cbind(level_pop, shuffled_matrices[[i]])
  result_f_stats <- wc(shuffled_matrices[[i]]) 
  result_f_stats <- as.data.frame(result_f_stats$per.loc)
  # Extract FST and FIS values
  fst_values <- result_f_stats$FST
  fis_values <- result_f_stats$FIS
  print( fst_values)
  # Assign values to the data frames
  fst_df <- cbind(fst_df, result_f_stats$FST)
  fis_df <- cbind(fis_df, result_f_stats$FIS)
}

# Set row names as in result_f_stats

rownames(fst_df) <- rownames(fis_df) <- rownames(result_f_stats)
result_FST <- fst_df[, -1]
fis_df <-fis_df[, -1]
vec <- seq(1, n_rep)
colnames(result_FST) <- colnames(fis_df) <- vec


result_FST[1,] 

count (result_f_stats[,1][1] > result_FST[1,] )
count <- sum(result_f_stats[,1][1] > result_FST[1, ])



# Initialize an empty data frame to store the counts
count_df <- data.frame(
  Greater = numeric(length(result_FST)),
  Smaller = numeric(length(result_FST))
)

# Compare the values in result_f_stats[1] to result_FST for each column
for (col in colnames(result_FST)) {
  greater_count <- sum(result_f_stats[1] > result_FST[, col])
  smaller_count <- sum(result_f_stats[1] < result_FST[, col])
  count_df$Greater[col] <- greater_count
  count_df$Smaller[col] <- smaller_count
}

# Print the count data frame
print(count_df)

######################## ######################## 

File export

library(radiator)

genomic_converter(
  data,
  strata = NULL,
  output = NULL,
  filename = NULL,
  parallel.core = parallel::detectCores() - 1,
  verbose = TRUE,
  ...
)

LS0tCnRpdGxlOiAiR2VuZVBvcCIKb3V0cHV0OiBodG1sX25vdGVib29rCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCi0tLQoKIyBQYXJhbWV0ZXJzIAoKYGBge3J9CmZpbHRlcmVkX2RhdGEgPC0gcmVhZC5jc3YoIi4uL2RhdGEvZGF0YS0yMDIzLTA5LTExICgyKS5jc3YiLCBoZWFkZXIgPSBUUlVFKQoKc2VsZWN0ZWRfc3RhdHMgPC0gYygiSG8iLCAiSHMiLCAiSHQiLCAiRmlzIChXJkMpIiwgIkZzdCAoVyZDKSIsICJGaXMgKE5laSkiLCAiRnN0IChOZWkpIgopCgpuX3JlcD0xMAoKbl9wb3AgPSA4CgpzZXF1ZW5jZV9sZW5ndGggPC0gbGVuZ3RoKDY6MTEpIApgYGAKCgoKIyBkYXRhIGZpbHRlcmluZyBjb252ZXJ0aW9uCgpgYGB7cn0KbGlicmFyeShoaWVyZnN0YXQpCmxpYnJhcnkoYWRlZ2VuZXQpCmZpbHRlcmVkX2RhdGEgPC0gZGF0YS5mcmFtZShpbmR2ID0gcGFzdGUoc3Vic3RyKGZpbHRlcmVkX2RhdGEkUG9wdWxhdGlvbiwxLDMpLCByb3cubmFtZXMoZmlsdGVyZWRfZGF0YSksIHNlcD0iLiIpLCBmaWx0ZXJlZF9kYXRhKQojIENyZWF0ZSBteWRhdGFfZ2VuaW5kCnBvcHVsYXRpb24gPC0gZmlsdGVyZWRfZGF0YSRQb3B1bGF0aW9uCm15ZGF0YV9nZW5pbmQgPC0gZGYyZ2VuaW5kKAogIFggPSBmaWx0ZXJlZF9kYXRhWyw2OjExXSwKICBzZXAgPSAiLyIsCiAgbmNvZGUgPSA2LAogIGluZC5uYW1lcyA9IGZpbHRlcmVkX2RhdGEkaW5kdiwKICBwb3AgPSBmaWx0ZXJlZF9kYXRhJFBvcHVsYXRpb24sCiAgTkEuY2hhciA9ICIwLzAiLAogIHBsb2lkeSA9IDIsCiAgdHlwZSA9ICJjb2RvbSIsCiAgc3RyYXRhID0gTlVMTCwKICBoaWVyYXJjaHkgPSBOVUxMCikKbXlkYXRhX2dlbmluZApteWRhdGFfaGllcmZzdGF0IDwtIGdlbmluZDJoaWVyZnN0YXQobXlkYXRhX2dlbmluZCkKYGBgCgoKCiMgUnVuIGJhc2ljLnN0YXRzIGFuZCByZW5kZXIgdGhlIHJlc3VsdAoKYGBge3J9CmxpYnJhcnkocGVnYXMpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGliYmxlKQoKcmVzdWx0IDwtIGJhc2ljLnN0YXRzKG15ZGF0YV9oaWVyZnN0YXQpCmRmX3Jlc3V0bF9iYXNpYzwtYXMuZGF0YS5mcmFtZShyZXN1bHQkcGVybG9jKQoKIyBXZWlyIGFuZCBDb2NrcmhhbSBlc3RpbWF0ZXMgb2YgRnN0YXRpc3RpY3MgLSBGSVMgYW5kIEZTVCAKcmVzdWx0X2Zfc3RhdHMgPC0gRnN0KGFzLmxvY2kobXlkYXRhX2dlbmluZCksIG5hLmFsbGVsZXMgPSAiIikKcmVzdWx0X2Zfc3RhdHMgPC0gcmVzdWx0X2Zfc3RhdHNbLDI6M10KY29sbmFtZXMocmVzdWx0X2Zfc3RhdHMpIDwtIGMoIkZzdCAoVyZDKSIsICJGaXMgKFcmQykiKQpyZXN1bHRfZl9zdGF0cyA8LSBtZXJnZShyZXN1bHRfZl9zdGF0cywgZGZfcmVzdXRsX2Jhc2ljLCBieT0icm93Lm5hbWVzIixhbGwueD1UUlVFKQpjb2xuYW1lcyhyZXN1bHRfZl9zdGF0cylbMTBdIDwtICJGc3QgKE5laSkiCmNvbG5hbWVzKHJlc3VsdF9mX3N0YXRzKVsxMl0gPC0gIkZpcyAoTmVpKSIKcmVzdWx0X2Zfc3RhdHMgPC0gcmVzdWx0X2Zfc3RhdHMgJT4lIGNvbHVtbl90b19yb3duYW1lcyguLCB2YXIgPSAnUm93Lm5hbWVzJykKcmVzdWx0X2Zfc3RhdHNfc2VsZWMgPC0gcmVzdWx0X2Zfc3RhdHMgJT4lIHNlbGVjdChhbGxfb2Yoc2VsZWN0ZWRfc3RhdHMpKQpyZXN1bHRfZl9zdGF0c19zZWxlYwpgYGAKCiMgRy1zdGF0aXN0aWMKCmBgYHtyfQpsaWJyYXJ5KGhyYnJ0aGVtZXMpCmxpYnJhcnkoZ2dwbG90MikKCiMgY29tcHV0ZSB0aGUgR3N0YXRzCnJlc3VsdF9mX3N0YXRzIDwtIHJlc3VsdF9mX3N0YXRzICU+JSBtdXRhdGUoR1NUID0gMS1Icy9IdCkKcmVzdWx0X2Zfc3RhdHMgPC0gcmVzdWx0X2Zfc3RhdHMgJT4lIG11dGF0ZSgiR1NUJyciID0gKG5fcG9wKihIdC1IcykpLygobl9wb3AqSHMtSHQpKigxLUhzKSkpCnJlc3VsdF9mX3N0YXRzCgojIFBsb3Qgd2l0aCBsaW5lYXIgdHJlbmQKcDIgPC0gZ2dwbG90KHJlc3VsdF9mX3N0YXRzLCBhZXMoeD1HU1QsIHk9SHMpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2Q9bG0gLCBjb2xvcj0icmVkIiwgc2U9RkFMU0UpICsKICB0aGVtZV9pcHN1bSgpCnAyCgpgYGAKCiMgTWlzc2luZyBkYXRhCgpgYGB7cn0KIyBMaWJyYXJpZXMKbGlicmFyeSgicG9wcHIiKQpsaWJyYXJ5KCJoZWF0bWFwbHkiKQoKbWlzc2luZ19kYXRhIDwtIGluZm9fdGFibGUobXlkYXRhX2dlbmluZCwgcGxvdCA9IEZBTFNFKQoKIyBNYXRyaXggZm9ybWF0Cm1hdCA8LSBhcy5tYXRyaXgobWlzc2luZ19kYXRhKQojIGhlYXRtYXAKcCA8LSBoZWF0bWFwbHkobWF0LCAKICAgICAgICAgICAgICAgZGVuZHJvZ3JhbSA9ICJub25lIiwKICAgICAgICAgICAgICAgeGxhYiA9ICIiLCB5bGFiID0gIiIsIAogICAgICAgICAgICAgICBtYWluID0gIiIsCiAgICAgICAgICAgICAgIHNjYWxlID0gImNvbHVtbiIsCiAgICAgICAgICAgICAgIG1hcmdpbnMgPSBjKDYwLDEwMCw0MCwyMCksCiAgICAgICAgICAgICAgIGdyaWRfY29sb3IgPSAid2hpdGUiLAogICAgICAgICAgICAgICBncmlkX3dpZHRoID0gMC4wMDAwMSwKICAgICAgICAgICAgICAgdGl0bGVYID0gRkFMU0UsCiAgICAgICAgICAgICAgIGhpZGVfY29sb3JiYXIgPSBUUlVFLAogICAgICAgICAgICAgICBicmFuY2hlc19sd2QgPSAwLjEsCiAgICAgICAgICAgICAgIGxhYmVsX25hbWVzID0gYygiUG9wdWxhdGlvbiIsICJNYXJrZXIiLCAiVmFsdWUiKSwKICAgICAgICAgICAgICAgZm9udHNpemVfcm93ID0gOCwgZm9udHNpemVfY29sID0gOCwKICAgICAgICAgICAgICAgbGFiQ29sID0gY29sbmFtZXMobWF0KSwKICAgICAgICAgICAgICAgbGFiUm93ID0gcm93bmFtZXMobWF0KSwKICAgICAgICAgICAgICAgaGVhdG1hcF9sYXllcnMgPSB0aGVtZShheGlzLmxpbmU9ZWxlbWVudF9ibGFuaygpKQopCnAKYGBgCgoKCiMgSFcgLSBQYW5taXhpYQojIyB3aXRoIHBlZ2FzCgpgYGB7cn0KCmxpYnJhcnkoInBlZ2FzIikKaHcudGVzdChhcy5sb2NpKG15ZGF0YV9nZW5pbmQpLCBCID0gMTAwMCkKI2xpCmBgYAoKIyMgd2l0aCBnZW5lcG9wCgpgYGB7cn0KbGlicmFyeShyYWRpYXRvcikKI2h0dHBzOi8vdGhpZXJyeWdvc3NlbGluLmdpdGh1Yi5pby9yYWRpYXRvci9yZWZlcmVuY2UvZ2Vub21pY19jb252ZXJ0ZXIuaHRtbAojaHR0cHM6Ly90aGllcnJ5Z29zc2VsaW4uZ2l0aHViLmlvL3JhZGlhdG9yL2FydGljbGVzL3JhZF9nZW5vbWljc19jb21wdXRlcl9zZXR1cC5odG1sCgpteWRhdGExIDwtIGdlbm9taWNfY29udmVydGVyKG15ZGF0YV9nZW5pbmQsIHBhcmFsbGVsLmNvcmUgPSBwYXJhbGxlbDo6ZGV0ZWN0Q29yZXMoKSAtIDEsIG91dHB1dCA9ICJnZW5lcG9wIiwgZmlsZW5hbWUgPSAiLi4vZGF0YS9teWRhdGEuZ2VuZXBvcC50eHQiKQoKbGlicmFyeShnZW5lcG9wKQojIGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9nZW5lcG9wL2dlbmVwb3AucGRmCmdlbmVwb3BfSFcgPC0gdGVzdF9IVygKICBpbnB1dEZpbGUgPSAiLi4vZGF0YS9teWRhdGEuZ2VuZXBvcC50eHQiLAogIHdoaWNoID0gIlByb2JhIiwKICBvdXRwdXRGaWxlID0gIiIsCiAgc2V0dGluZ3NGaWxlID0gIiIsCiAgZW51bWVyYXRpb24gPSBGQUxTRSwKICBkZW1lbW9yaXphdGlvbiA9IDEwMDAwLAogIGJhdGNoZXMgPSAyMCwKICBpdGVyYXRpb25zID0gNTAwMCwKICB2ZXJib3NlID0gaW50ZXJhY3RpdmUoKQopCmBgYAoKCgojIExpbmthZ2UgRGlzZXF1aWxpYnJpdW0KSSBoYXZlIGZvdW5kIGRpZmZlcmVudCB2YWx1ZXMgZnJvbSBGc3RhdHMuIAoKIyMgd2l0aCBwb3BwcgoKVGhlIGluZGV4IG9mIGFzc29jaWF0aW9uIHdhcyBvcmlnaW5hbGx5IGRldmVsb3BlZCBieSBBLkguRC4gQnJvd24gYW5hbHl6aW5nIHBvcHVsYXRpb24gc3RydWN0dXJlIG9mIHdpbGQgYmFybGV5IChCcm93biwgMTk4MCkuCgpJYTogVGhlIGluZGV4IG9mIGFzc29jaWF0aW9uLgpwLklhOiBUaGUgcC12YWx1ZSByZXN1bHRpbmcgZnJvbSBhIG9uZS1zaWRlZCBwZXJtdXRhdGlvbiB0ZXN0IGJhc2VkIG9uIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpbmRpY2F0ZWQgaW4gdGhlIG9yaWdpbmFsIGNhbGwuCnJiYXJkOiBUaGUgc3RhbmRhcmRpemVkIGluZGV4IG9mIGFzc29jaWF0aW9uLgpwLnJkOiBUaGUgcC12YWx1ZSByZXN1bHRpbmcgZnJvbSBhIG9uZS1zaWRlZCBwZXJtdXRhdGlvbiB0ZXN0IGJhc2VkIG9uIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpbmRpY2F0ZWQgaW4gdGhlIG9yaWdpbmFsIGNhbGwuCgogcGFpci5pYSBjYWxjdWxhdGVzIHRoZSBpbmRleCBvZiBhc3NvY2lhdGlvbiBpbiBhIHBhaXJ3aXNlIG1hbm5lciBhbW9uZyBhbGwgbG9jaS4KCmBgYHtyfQpsb2NpX3BhaXIgPC0gcGFpci5pYShteWRhdGFfZ2VuaW5kLCBzYW1wbGUgPSAxMDAwLCBxdWlldCA9IEZBTFNFLCBtZXRob2QgPSAxLHBsb3QgPSBGQUxTRSkKCgpgYGAKCiMjIHdpdGggZ2VuZXBvcAoKYGBge3J9CmxpYnJhcnkoZ2VuZXBvcCkKdGVzdF9MRCgKICBpbnB1dEZpbGUgPSAiLi4vZGF0YS9teWRhdGEuZ2VuZXBvcC50eHQiLAogIG91dHB1dEZpbGUgPSAiIiwKICBzZXR0aW5nc0ZpbGUgPSAiIiwKICBkZW1lbW9yaXphdGlvbiA9IDEwMDAwLAogIGJhdGNoZXMgPSAxMDAsCiAgaXRlcmF0aW9ucyA9IDUwMDAsCiAgdmVyYm9zZSA9IGludGVyYWN0aXZlKCkKKQpgYGAKCiMjIHdpdGggcGVnYXMKCkxEMiBpcyBiYXNlZCBvbiB0aGUgb2JzZXJ2ZWQgZnJlcXVlbmNpZXMgb2YgZGlmZmVyZW50IGdlbm90eXBlcyAoU2NoYWlkIDIwMDQpLgoKYGBge3J9CgptYXRfYWxsZWxlcyA8LSBmaWx0ZXJlZF9kYXRhICU+JSBzZWxlY3QoUG9wdWxhdGlvbikKbWF0X2FsbGVsZXMgIDwtIGNiaW5kKG1hdF9hbGxlbGVzLCBmaWx0ZXJlZF9kYXRhWyw2OjExXSkKbWF0X2FsbGVsZXNfbG9jaSA8LSBhbGxlbGVzMmxvY2kobWF0X2FsbGVsZXMsICBwbG9pZHkgPSAxLCBwb3B1bGF0aW9uID0gMSwgcGhhc2VkID0gRkFMU0UpCmxpbmthZ2VfcGVnYXMgPC0gTEQyKG1hdF9hbGxlbGVzX2xvY2kpCnByaW50KGxpbmthZ2VfcGVnYXMkVDIpCmBgYAoKV2UgdGh1cyBhY2NlcHQgdGhlIG51bGwgaHlwb3RoZXNpcyBvZiBubyBsaW5rYWdlIGFtb25nIG1hcmtlcnMgKFAtdmFsID0gMC4wMjMxMzE2NykKCgoKCgoKCgoKCgoKCgoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBERVZFTE9QTUVOVCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgCiMjIyMjIyMjIyMjIyMjIyMjIG5vdCByZWFkeSBmb3IgZGVwbG95bWVudCAjIyMjIyMjIyMjIyMjIyMjIyMKCiMgcGFubWl4aWEgRnN0YXQgLSBzaHVmZmxlIGRmCgpgYGB7cn0KCiNzaHVmZmxlZF9tYXRyaWNlcyA8LSByZXBsaWNhdGUobl9yZXAsIG1hdFtzYW1wbGUobnJvdyhtYXQpKSwgXSwgc2ltcGxpZnkgPSBGQUxTRSkKc2h1ZmZsZWRfbWF0cmljZXMgPC0gcmVwbGljYXRlKG5fcmVwLCBtYXRbc2FtcGxlKGxlbmd0aChtYXQpLCByZXBsYWNlID0gRkFMU0UpXSwgc2ltcGxpZnkgPSBGQUxTRSkKIyMjIyMjIyMjIyMjIyMjIyMjCiMgc2h1ZmZsZSBvbmx5IHRoZSBnZW5vdHlwZSBhbmQgYWRkIHRoZSBwb3AgY29sdW1uIGxhdGVyIGZvciBlYWNoIG1hdHJpY2VzLiAKI2luIHRoZSBsb29wPyAKIyMjIyMjIyMjIyMjIyMjCgoKIyBDcmVhdGUgYSBsaXN0IHRvIHN0b3JlIHRoZSB3Ywpmc3RfZGYgPC0gbnVtZXJpYyhzZXF1ZW5jZV9sZW5ndGgpCmZpc19kZiA8LSBudW1lcmljKHNlcXVlbmNlX2xlbmd0aCkKCiMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIGZvciBlYWNoIHNodWZmbGVkIG1hdHJpeAoKIyBJdGVyYXRlIHRocm91Z2ggdGhlIHNodWZmbGVkIG1hdHJpY2VzCmZvciAoaSBpbiAxOm5fcmVwKSB7CiAgIyBDYWxjdWxhdGUgdGhlIHN0YXRpc3RpY3MgZm9yIHRoZSBpLXRoIG1hdHJpeAogICNIRVJFIFRIRSBDT0xVTU4gUE9QCiAgbWVyZ2VkX2RmIDwtIGNiaW5kKGxldmVsX3BvcCwgc2h1ZmZsZWRfbWF0cmljZXNbW2ldXSkKICByZXN1bHRfZl9zdGF0cyA8LSB3YyhzaHVmZmxlZF9tYXRyaWNlc1tbaV1dKSAKICByZXN1bHRfZl9zdGF0cyA8LSBhcy5kYXRhLmZyYW1lKHJlc3VsdF9mX3N0YXRzJHBlci5sb2MpCiAgIyBFeHRyYWN0IEZTVCBhbmQgRklTIHZhbHVlcwogIGZzdF92YWx1ZXMgPC0gcmVzdWx0X2Zfc3RhdHMkRlNUCiAgZmlzX3ZhbHVlcyA8LSByZXN1bHRfZl9zdGF0cyRGSVMKICBwcmludCggZnN0X3ZhbHVlcykKICAjIEFzc2lnbiB2YWx1ZXMgdG8gdGhlIGRhdGEgZnJhbWVzCiAgZnN0X2RmIDwtIGNiaW5kKGZzdF9kZiwgcmVzdWx0X2Zfc3RhdHMkRlNUKQogIGZpc19kZiA8LSBjYmluZChmaXNfZGYsIHJlc3VsdF9mX3N0YXRzJEZJUykKfQoKIyBTZXQgcm93IG5hbWVzIGFzIGluIHJlc3VsdF9mX3N0YXRzCgpyb3duYW1lcyhmc3RfZGYpIDwtIHJvd25hbWVzKGZpc19kZikgPC0gcm93bmFtZXMocmVzdWx0X2Zfc3RhdHMpCnJlc3VsdF9GU1QgPC0gZnN0X2RmWywgLTFdCmZpc19kZiA8LWZpc19kZlssIC0xXQp2ZWMgPC0gc2VxKDEsIG5fcmVwKQpjb2xuYW1lcyhyZXN1bHRfRlNUKSA8LSBjb2xuYW1lcyhmaXNfZGYpIDwtIHZlYwoKCnJlc3VsdF9GU1RbMSxdIAoKY291bnQgKHJlc3VsdF9mX3N0YXRzWywxXVsxXSA+IHJlc3VsdF9GU1RbMSxdICkKY291bnQgPC0gc3VtKHJlc3VsdF9mX3N0YXRzWywxXVsxXSA+IHJlc3VsdF9GU1RbMSwgXSkKCgoKIyBJbml0aWFsaXplIGFuIGVtcHR5IGRhdGEgZnJhbWUgdG8gc3RvcmUgdGhlIGNvdW50cwpjb3VudF9kZiA8LSBkYXRhLmZyYW1lKAogIEdyZWF0ZXIgPSBudW1lcmljKGxlbmd0aChyZXN1bHRfRlNUKSksCiAgU21hbGxlciA9IG51bWVyaWMobGVuZ3RoKHJlc3VsdF9GU1QpKQopCgojIENvbXBhcmUgdGhlIHZhbHVlcyBpbiByZXN1bHRfZl9zdGF0c1sxXSB0byByZXN1bHRfRlNUIGZvciBlYWNoIGNvbHVtbgpmb3IgKGNvbCBpbiBjb2xuYW1lcyhyZXN1bHRfRlNUKSkgewogIGdyZWF0ZXJfY291bnQgPC0gc3VtKHJlc3VsdF9mX3N0YXRzWzFdID4gcmVzdWx0X0ZTVFssIGNvbF0pCiAgc21hbGxlcl9jb3VudCA8LSBzdW0ocmVzdWx0X2Zfc3RhdHNbMV0gPCByZXN1bHRfRlNUWywgY29sXSkKICBjb3VudF9kZiRHcmVhdGVyW2NvbF0gPC0gZ3JlYXRlcl9jb3VudAogIGNvdW50X2RmJFNtYWxsZXJbY29sXSA8LSBzbWFsbGVyX2NvdW50Cn0KCiMgUHJpbnQgdGhlIGNvdW50IGRhdGEgZnJhbWUKcHJpbnQoY291bnRfZGYpCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIAoKYGBgCgoKCiMgRmlsZSBleHBvcnQgCgpgYGB7cn0KbGlicmFyeShyYWRpYXRvcikKCmdlbm9taWNfY29udmVydGVyKAogIGRhdGEsCiAgc3RyYXRhID0gTlVMTCwKICBvdXRwdXQgPSBOVUxMLAogIGZpbGVuYW1lID0gTlVMTCwKICBwYXJhbGxlbC5jb3JlID0gcGFyYWxsZWw6OmRldGVjdENvcmVzKCkgLSAxLAogIHZlcmJvc2UgPSBUUlVFLAogIC4uLgopCmBgYAoKIwoKYGBge3J9CgoKYGBgCgojCgpgYGB7cn0KCgpgYGAKCiMKCmBgYHtyfQoKCmBgYAoKIwoKYGBge3J9CgoKYGBgCgojCgpgYGB7cn0KCgpgYGAKCiMKCmBgYHtyfQoKCmBgYAoKIwoKYGBge3J9CgoKYGBgCg==